home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / telecomm / uwsrc.arc / KERMIT.C < prev    next >
C/C++ Source or Header  |  1989-04-29  |  40KB  |  1,159 lines

  1. #define EXTRADEBUG
  2. /*
  3.  *  K e r m i t  File Transfer Utility seriously hacked for local use with uw
  4.  *
  5.  *  Currently allows only one kermit session to exist in one window concurent.
  6.  *
  7.  *  Adapted from UNIX Kermit, Columbia University, 1981, 1982, 1983
  8.  *      Bill Catchings, Bob Cattani, Chris Maio, Frank da Cruz, Alan Crosswell
  9.  *
  10.  *  Also:   Jim Guyton, Rand Corporation
  11.  *          Walter Underwood, Ford Aerospace
  12.  *
  13.  */
  14.  
  15. /*
  16.  * March 28, 1988
  17.  *        Hacked into form usable in uw.  Converted fsm's to be driven
  18.  *        by received packet events.  Rewrote rpack routine.
  19.  */
  20.  
  21. #include <obdefs.h>
  22. #include <gemdefs.h>
  23. #include <osbind.h>
  24. #include <stdio.h>          /* Standard UNIX definitions */
  25. #include <time.h>
  26. #include "wind.h"
  27. #include "windefs.h"
  28.  
  29. #define error printmsg
  30. #define chari int        /* items of type chari should be char, but, mwc
  31.                  insists on adjusting them to int anyway */
  32. /* Symbol Definitions */
  33.  
  34. #define MAXPACKSIZ  94      /* Maximum packet size */
  35. #define SOH         1       /* Start of header */
  36. #define CR          13      /* ASCII Carriage Return */
  37. #define SP          32      /* ASCII space */
  38. #define DEL         127     /* Delete (rubout) */
  39.  
  40. #define MAXTRY      10      /* Times to retry a packet */
  41. #define MYQUOTE     '#'     /* Quote character I will use */
  42. #define MYPAD       0       /* Number of padding characters I will need */
  43. #define MYPCHAR     0       /* Padding character I need (NULL) */
  44.  
  45. #define MYEOL       '\r'    /* End-Of-Line character I need */
  46.  
  47. #define MYTIME      10      /* Seconds after which I should be timed out */
  48. #define MAXTIM      60      /* Maximum timeout interval */
  49. #define MINTIM      10      /* Minumum timeout interval */
  50.  
  51. #ifndef TRUE
  52. #define TRUE        -1      /* Boolean constants */
  53. #endif
  54. #define FALSE       0
  55. #define GETPACK     2        /* return constant */
  56.  
  57. /* Macro Definitions */
  58.  
  59. /*
  60.  *  f l u s h i n p u t
  61.  *
  62.  *  Dump all pending input to clear stacked up NACK's.
  63.  */
  64.  
  65. #define flushinput()    /* no explicit call to flush needed for uw */
  66.  
  67. /*
  68.  * tochar: converts a control character to a printable one by adding a space.
  69.  *
  70.  * unchar: undoes tochar.
  71.  *
  72.  * ctl:    converts between control characters and printable characters by
  73.  *         toggling the control bit (ie. ^A becomes A and A becomes ^A).
  74.  */
  75. #define tochar(ch)  ((ch) + ' ')
  76. #define unchar(ch)  ((ch) - ' ')
  77. #define ctl(ch)     ((ch) ^ 64 )
  78. #define abs(exp) (((exp) >= 0) ? (exp) : -(exp))
  79.  
  80.  
  81. /* Global Variables */
  82.  
  83. extern int    mouse;                /* is mouse visible ? */
  84. extern    struct    wi_str    w[];
  85.  
  86. int     size,               /* Size of present data */
  87.         rpsiz,              /* Maximum receive packet size */
  88.         spsiz,              /* Maximum send packet size */
  89.         pad,                /* How much padding to send */
  90.         reqtimint,          /* timeout interval I request */
  91.         timint,             /* Timeout for foreign host on sends */
  92.         n,                  /* Packet number */
  93.         numtry,             /* Times this packet retried */
  94.         oldtry,             /* Times previous packet retried */
  95.         image,              /* -1 means 8-bit mode */
  96.         debug,              /* indicates level of debugging output (0=none) */
  97.         filnamcnv,          /* -1 means do file name case conversions */
  98.         filecount,          /* Number of files left to send */
  99.     kermwdes,        /* Window descripter for kermit window */
  100.     kermport;        /* port number for kermit window */
  101.  
  102. clock_t    timestamp;        /* Time last packet was received */
  103.  
  104. char    sflg, rflg;         /* flags for RECEIVE, SEND */
  105. char    state,              /* Present state of the automaton */
  106.         padchar,            /* Padding character to send */
  107.         eol,                /* End-Of-Line character to send */
  108.         quote,              /* Quote character in incoming data */
  109.         **filelist,         /* List of files to be sent */
  110.     *filnam,            /* Current file name */
  111.         recpkt[MAXPACKSIZ+1], /* Receive packet buffer */
  112.         packet[MAXPACKSIZ+1]; /* Packet buffer */
  113.  
  114. FILE    *fp,                /* File pointer for current disk file */
  115.         *log;               /* File pointer for Logfile */
  116.  
  117.  
  118. /*
  119.  *  kerminit
  120.  *
  121.  *  initalization routine - initalize and dispatch to the appropriate routine.
  122.  */
  123.  
  124. int kerminit(curwin)
  125. int curwin;
  126. {
  127.     OBJECT *obj_tmp;
  128.     static char path[40] = ".\*.*";
  129.     static char file[40] = "";
  130.     static char filename[80];        /* space for file and directory */
  131.     int butt;
  132.  
  133. /*  Initialize these values and hope the first packet will get across OK */
  134.  
  135.     if (kermwdes && w[kermwdes].kerm_act) return (-1);
  136.     kermwdes = curwin;
  137.                         /* If kermit already active, return. */
  138.     w[kermwdes].kerm_act = TRUE;    /* mark current window to send output
  139.                            to kermit instead of emulator */
  140.     kermport = find_port(curwin);
  141.     eol = CR;                           /* EOL for outgoing packets */
  142.     quote = '#';                        /* Standard control-quote char "#" */
  143.     pad = 0;                            /* No padding */
  144.     padchar = '\0';                     /* Use null if any padding wanted */
  145.     timint = MYTIME;                    /* default timint */
  146.  
  147.  
  148. /*
  149.  * Set direction and paramaters debug, filnamcnv, image with dialog
  150.  */
  151.     rsrc_gaddr(R_TREE, KERMPARM, &obj_tmp);
  152.     if (obj_tmp[ASCIIMOD].ob_state == NORMAL &&
  153.       obj_tmp[IMAGEMOD].ob_state == NORMAL)
  154.     {                    /* initalize object and statics */
  155.         objc_change(obj_tmp, ASCIIMOD, 0, 0, 0, 0, 0, SELECTED, 0);
  156.         objc_change(obj_tmp, CONVNAME, 0, 0, 0, 0, 0, SELECTED, 0);
  157.         objc_change(obj_tmp, RECFILE, 0, 0, 0, 0, 0, SELECTED, 0);
  158.  
  159.     path[0] = Dgetdrv() + 'a';
  160.     path[1] = ':';
  161.     Dgetpath(path+2, 0);
  162.     strcat(path, "\\*.*");
  163.     }
  164.     if ((butt = s_dial(KERMPARM, 3)) == KERMEXIT) return(kermterm());
  165.     if (obj_tmp[DEBUGENA].ob_state == SELECTED)
  166.     {
  167.         debug = obj_tmp[DEBUG1].ob_state + obj_tmp[DEBUG2].ob_state
  168.     + obj_tmp[DEBUG3].ob_state;
  169.     }
  170.     if (butt == RECFILE) obj_tmp[RECFILE].ob_state = SELECTED;
  171.     if (butt == SENDFILE) obj_tmp[SENDFILE].ob_state = SELECTED;
  172.     rflg = obj_tmp[RECFILE].ob_state;
  173.     sflg = obj_tmp[SENDFILE].ob_state;
  174.     image = (obj_tmp[IMAGEMOD].ob_state == SELECTED);
  175.     filnamcnv = obj_tmp[CONVNAME].ob_state; /* conversion for UNIX systems */
  176.     
  177. /* All set up, now execute the command that was given. */
  178.  
  179.     if (debug)
  180.     {
  181.         printmsg("debuging level = %d\n",debug);
  182.  
  183.         if (sflg) printmsg("Send command\n");
  184.         if (rflg) printmsg("Receive command\n");
  185.     }
  186.   
  187.     if (sflg)                           /* Send command */ 
  188.     {
  189.         extern char * rindex();
  190.  
  191.     if (!mouse)
  192.     {
  193.         graf_mouse(M_ON, NULL);
  194.         ++mouse;
  195.     }
  196.         fsel_input(path, file, &butt);
  197.     if (! butt) return(kermterm()); 
  198.     strcpy(filename, path);
  199.     if (debug > 2) printmsg("directory %s", filename);
  200.     filnam = rindex(filename, '\\');
  201.     if (filnam) *(++filnam) = '\0';
  202.     strcat(filename, file);
  203.         filnam = filename;        /* Get file to send */
  204.         if (debug > 2) printmsg("sending %s",filnam);
  205.         fp = NULL;                      /* Indicate no file open yet */
  206.         filelist = NULL;                /* Set up the rest of the file list */
  207.         filecount = 0;                  /* Number of files left to send */
  208.     state = 'S';                    /* Send initiate is the start state */
  209.     n = 0;                          /* Initialize message number */
  210.     numtry = 0;                     /* Say no tries yet */
  211.         w[kermwdes].kerm_act = TRUE;    /* mark current window to send output
  212.                            to kermit instead of emulator */
  213.     timestamp = clock();        /* reset timer */
  214.     sendsw();
  215.     }
  216.  
  217.     if (rflg)                           /* Receive command */
  218.     {
  219.     state = 'R';                    /* Receive-Init is the start state */
  220.     n = 0;                          /* Initialize message number */
  221.     numtry = 0;                     /* Say no tries yet */
  222.     timestamp = clock();        /* reset timer */
  223.     }
  224.     
  225.     return(0);
  226. }
  227.  
  228. /*
  229.  * kermterm - Terminate kermit and tell uw not to call us again.
  230.  */
  231. kermterm()
  232. {
  233.     sflg = rflg = 0;
  234.     w[kermwdes].kerm_act = FALSE;
  235.     kermwdes = 0;
  236. }
  237.  
  238. kermtimchk()
  239. {
  240.     if (!w[kermwdes].kerm_act)    /* is ker